什麼是Dependency Injection
Dependency Injection 在 .NET Core扮演的角色
Service Lifetime
ASP .NET Core 仰賴相依性注入 DI (Dependency Injection)
這篇整理一下DI的介紹,以及來釐清在整個 .NET Core 平台是如何使用DI去使用每個服務的
DI是一種design patten
主要透過介面的設計去注入到不同的Object
在Study DI 的時候,一定會看到另外一個名詞
IoC - Inversion of Control 控制反轉
以下有爬到一篇大大的簡單清楚的說明
簡單來說(畫重點)
IOC 產生介面提供使用端去實作
就是將傳統由上到下的開發思維,改用介面的方式操作,需要用的的時候再將介面實例化就可以了,如此一來就不需要寫太多重複的程式碼,也可增加彈性及擴充性
DI 將interface,真正注入到物件的方式
決定什麼時候要使用這些建立好的interface,怎麼使用?
C#裡有提供三種 DI 的操作方式 (從建構子/屬性/方法去注入介面)
而 ASP .NET Core 是使用 Constructor Injection ,在建構子的時候去注入介面
前面敘述的是DI的作用,那接下來要提到的問題就是
微軟有沒有一些現成已經做好的DI可以直接使用?
如果要自己實作一個DI, ASP .NET Core又該如何去實作?
在 ASP .NET Core裡的DI,主要分成下列兩大類:
Framework Services(微軟已經幫我們做好的)
在專案範本下看到的IServiceCollection,IWebHostEnvironment 以及IApplicationBuilder 等等
Application Services(我們自己開發的)
這裡要先提一個東西IoC Container
IoC 是一個設計的原理概念,IoC Container是一個提供這種設計原理(IoC)的一個容器,在 .NET 裡面可以把它想成就是一些一堆framework來提供我們實例化的東西注入我們要的目的位子,去執行設計好的邏輯
在這邊用自己的理解來舉一個簡單的例子
有一天忽然想要吃麥當勞的薯條
我可以透過foodpanda 去 達成我的目的
可以把 foodpanda 想成是一個Ioc Container , 我想要買麥當勞的薯條, 我可以透過外送平台去幫我拿到我要的薯條(要實例化的 Object )
,假設今天想要是鼎泰豐(其他的 Object ),我只要注入我想要吃的餐廳,就可以去使用那個餐廳的餐點(物件裡面的參數或方法)
我 - 目標的Object
foodpanda - IoC Container
麥當勞 - 需要實例化的Object
後面會利用這個例子去做一個範例
所以在ASP .NET Core 裡的 IoC Container 提供了兩個介面,透過這些界面下的擴充方法可以去實例化我們要注入的物件
(就像外送平台有Uber eats, foodpand...etc)
IServiceProvider
這個介面使用的方式待補
目前只知道有提供一個GetService可以去實例化物件
但如何使用,這部分還要再研究,也歡迎有大大理解的可以指教一下
IServiceCollection
網路上大部分的範例以及解說都是在講這一個介面
後面也會練習一下使用這個介面去操作
先來看一下這兩個介面的可以實作的關係圖
這裡討論的service 主要是針對 IServiceCollection
其中的生命週期有包含以下三種
對應上述的三種生命週期的特性
IServiceCollection 下也提供了三種對應的方法,這些方法就是網路上大家說的 DI 時 service 所使用的方法
後續會再補上一個範例
參考資料
https://blog.johnwu.cc/article/ironman-day04-asp-net-core-dependency-injection.html
https://www.tutorialsteacher.com/core/internals-of-builtin-ioc-container-in-aspnet-core